package com.nowcoder.community.util;


/**
 * 生成redis key工具类
 * 方便复用
 */
public class RedisKeyUtil {

    private static final String SPLIT = ":";
    private static final String PREFIX_ENTITY_LIKE = "like:entity";
    private static final String PREFIX_USER_LIKE = "like:user";
    private static final String PREFIX_FOLLOWEE = "followee";
    private static final String PREFIX_FOLLOWER = "follower";
    private static final String PREFIX_KAPTCHA = "kaptcha";
    private static final String PREFIX_TICKET = "ticket";
    private static final String PREFIX_USER = "user";
    private static final String PREFIX_UV = "uv";
    private static final String PREFIX_DAU = "dau";
    private static final String PREFIX_POST = "post";

    /**
     * 获取某个实体获得的赞 Set类型
     * @param entityType 实体类型
     * @param entityId 实体id
     * @return 获得 某个实体的赞 的key
     *          key 的 结构 like:entity:entityType:entityId -> set(userId)
     */
    public static String getEntityLikeKey(int entityType, int entityId) {
        return PREFIX_ENTITY_LIKE + SPLIT + entityType + SPLIT + entityId;
    }

    /**
     * 获取某个用户获得的赞（包括这个用户主页，帖子，评论总共的赞） String类型
     * @param userId 用户id
     * @return 获取 某个用户的赞 key
     *         key的结构： like:user:userId -> int
     */
    public static String getUserLikeKey(int userId) {
        return PREFIX_USER_LIKE + SPLIT + userId;
    }

    /**
     * 某个用户关注的实体 数据类型 ZSet（方便后续查询时，从最新关注排序开始后展示）
     * @param userId 用户id
     * @param entityType 实体类型
     * @return 获得 某个用户关注的实体 key
     *         key的结构 followee:userId:entityType -> zset(entityId,now)
     */
    public static String getFolloweeKey(int userId, int entityType) {
        return PREFIX_FOLLOWEE + SPLIT + userId + SPLIT + entityType;
    }

    /**
     * 某个实体拥有的粉丝  数据类型 ZSet（方便查询后，从最新关注排序开始后展示）
     * @param entityType 实体类型
     * @param entityId 实体id
     * @return 获得 某个实体拥有的粉丝 key
     *         key结构： follower:entityType:entityId -> zset(userId,now)
     */
    public static String getFollowerKey(int entityType, int entityId) {
        return PREFIX_FOLLOWER + SPLIT + entityType + SPLIT + entityId;
    }

    /**
     * 登录验证码 String类型
     * @param owner 这次session专属UUID
     * @return 获取登录验证码的key
     */
    public static String getKaptchaKey(String owner) {
        return PREFIX_KAPTCHA + SPLIT + owner;
    }

    /**
     * String类型
     * @param ticket 登录凭证中的ticket
     * @return 获取登录凭证的key
     */
    public static String getTicketKey(String ticket) {
        return PREFIX_TICKET + SPLIT + ticket;
    }

    /**
     * String类型
     * @param userId 用户id
     * @return 获取User的key，目的User经常会在程序中用到，且User数据变动不大
     */
    public static String getUserKey(int userId) {
        return PREFIX_USER + SPLIT + userId;
    }

    /**
     * HyperLogLog
     * @param date 日期
     * @return 获得单日UV的key
     */
    public static String getUVKey(String date) {
        return PREFIX_UV + SPLIT + date;
    }

    /**
     * HyperLogLog
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 获得 区间UV 的key
     */
    public static String getUVKey(String startDate, String endDate) {
        return PREFIX_UV + SPLIT + startDate + SPLIT + endDate;
    }

    /**
     * Bitmap
     * @param date 时间
     * @return 获取 单日活跃用户 的key
     */
    public static String getDAUKey(String date) {
        return PREFIX_DAU + SPLIT + date;
    }

    /**
     * Bitmap
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 获取 区间活跃用户 的key
     */
    public static String getDAUKey(String startDate, String endDate) {
        return PREFIX_DAU + SPLIT + startDate + SPLIT + endDate;
    }

    // 帖子分数
    public static String getPostScoreKey() {
        return PREFIX_POST + SPLIT + "score";
    }

}
